Tidy Data

Marina Muradian

O operador Pipe

  • Passa o objeto do lado esquerdo como primeiro argumento (ou .argumento) da função do lado direito:

    • x %>% f(y) é equivalente a f(x, y)

    • y %>% f(x, ., z) é equivalente a f(x, y, z )

  • Torna a leitura de códigos mais lógica e compreensível

  • Ctrl + Shift + M

x <- c(1, 2, 3, 4)

x %>% sum %>% sqrt
[1] 3.162278
sqrt(sum(x))
[1] 3.162278

Tidy Data

Tidy Data

Por que garantir que os dados estejam arrumados?

Pivoting

Problemas comuns nas bases de dados:

O que é uma observação neste gráfico?

Wide para Long

table4a
# A tibble: 3 x 3
  country     `1999` `2000`
* <chr>        <int>  <int>
1 Afghanistan    745   2666
2 Brazil       37737  80488
3 China       212258 213766
  • Os nomes das colunas 1999 e 2000 representam da variável year
  • Os valores das colunas 1999 e 2000 representam a variável cases
  • Dessa maneira, cada linha representa duas observações e não uma.

pivot_longer()

Para arrumar a table4a,vamos transformar as colunas 1999 e 2000 num novo par de variáveis.

Para essa operação, precisamos de 3 parâmetros:

  1. O conjunto de colunas que representa valores, não variáveis: 1999 e 2000

  2. O nome da variável que receberá os valores acima (names_to): year

  3. O nome da variável que receberá os valores guardados nas colunas (values_to): cases

Juntos, esses parâmetros geram a chamada para pivot_longer():

table4a %>% 
  pivot_longer(c(`1999`, `2000`),
               names_to = "year",
               values_to = "cases")

pivot_longer()

table4a %>% 
  pivot_longer(c(`1999`, `2000`),
               names_to = "year",
               values_to = "cases")
# A tibble: 6 x 3
  country     year   cases
  <chr>       <chr>  <int>
1 Afghanistan 1999     745
2 Afghanistan 2000    2666
3 Brazil      1999   37737
4 Brazil      2000   80488
5 China       1999  212258
6 China       2000  213766

pivot_longer()

O que é uma observação neste gráfico?

Long para Wide

Na table2, as observações (ano, país) estão espalhadas em linhas diferentes:

# A tibble: 12 x 4
   country      year type            count
   <chr>       <int> <chr>           <int>
 1 Afghanistan  1999 cases             745
 2 Afghanistan  1999 population   19987071
 3 Afghanistan  2000 cases            2666
 4 Afghanistan  2000 population   20595360
 5 Brazil       1999 cases           37737
 6 Brazil       1999 population  172006362
 7 Brazil       2000 cases           80488
 8 Brazil       2000 population  174504898
 9 China        1999 cases          212258
10 China        1999 population 1272915272
11 China        2000 cases          213766
12 China        2000 population 1280428583

pivot_wider()

Para arrumarmos a table2, utilizaremos a função pivot_wider() que utiliza dois parâmetros:

  1. A coluna que contém o nome das variáveis(names_from): type

  2. A coluna que contém os valores (values_from): count

table2 %>% 
  pivot_wider(names_from = "type",
              values_from = "count")
# A tibble: 6 x 4
  country      year  cases population
  <chr>       <int>  <int>      <int>
1 Afghanistan  1999    745   19987071
2 Afghanistan  2000   2666   20595360
3 Brazil       1999  37737  172006362
4 Brazil       2000  80488  174504898
5 China        1999 212258 1272915272
6 China        2000 213766 1280428583

pivot_wider()

Separar e Unir

O problema da table3 é diferente:

# A tibble: 6 x 3
  country      year rate             
* <chr>       <int> <chr>            
1 Afghanistan  1999 745/19987071     
2 Afghanistan  2000 2666/20595360    
3 Brazil       1999 37737/172006362  
4 Brazil       2000 80488/174504898  
5 China        1999 212258/1272915272
6 China        2000 213766/1280428583

A coluna rate contém valores de duas variáveis (casese population)

Separar

Para corrigir esse problema, utilizaremos a função separate():

  1. A coluna rate contém as duas variáveis que serão separadas

  2. As colunas resultantes serão cases e population

table3 %>% 
  separate(rate,
           c("cases", "population"),
           sep = "/")
# A tibble: 6 x 4
  country      year cases  population
  <chr>       <int> <chr>  <chr>     
1 Afghanistan  1999 745    19987071  
2 Afghanistan  2000 2666   20595360  
3 Brazil       1999 37737  172006362 
4 Brazil       2000 80488  174504898 
5 China        1999 212258 1272915272
6 China        2000 213766 1280428583

Separar

Unir

Intuitivamente, unite() é o inverso de separate(): ele combina várias colunas numa única.

table5
# A tibble: 6 x 4
  country     century year  rate             
* <chr>       <chr>   <chr> <chr>            
1 Afghanistan 19      99    745/19987071     
2 Afghanistan 20      00    2666/20595360    
3 Brazil      19      99    37737/172006362  
4 Brazil      20      00    80488/174504898  
5 China       19      99    212258/1272915272
6 China       20      00    213766/1280428583

Neste exemplo, nosso interesse é em unir as colunas centurye year numa só (daremos o nome de new).

Unir

table5 %>% 
  unite(new,
        century,
        year,
        sep = "")
# A tibble: 6 x 3
  country     new   rate             
  <chr>       <chr> <chr>            
1 Afghanistan 1999  745/19987071     
2 Afghanistan 2000  2666/20595360    
3 Brazil      1999  37737/172006362  
4 Brazil      2000  80488/174504898  
5 China       1999  212258/1272915272
6 China       2000  213766/1280428583